home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / symbol.s < prev    next >
Text File  |  1999-10-08  |  19KB  |  714 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        シンボル管理
  4. ;        < symbol.s >
  5. ;
  6. ;    $Id: symbol.s,v 1.8  1999 10/ 8(Fri) 21:49:32 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;              1999     by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    has.equ
  13.     .include    symbol.equ
  14.     .include    tmpcode.equ
  15.  
  16.     .cpu    68000
  17.     .text
  18.  
  19.  
  20. ;----------------------------------------------------------------
  21. ;    マクロ定義
  22. ;----------------------------------------------------------------
  23.  
  24. ;----------------------------------------------------------------
  25. ;    ハッシュ関数の計算
  26. ;    in :a2=文字列へのポインタ/d2.w=文字列長-1
  27. ;    out:d0.l=ハッシュ関数値        (d3を破壊)
  28.   .ifdef MASK_HASH
  29. hashfnc    .macro    hashsize_minus_1
  30.     moveq.l    #0,d0
  31. @loop:
  32.     moveq.l    #$20,d3            ;(大文字・小文字の違いは無視)
  33.     or.b    (a2)+,d3
  34.     add.w    d3,d0
  35.     ror.w    #3,d0
  36.     sub.w    d3,d0
  37.     dbra    d2,@loop
  38.     and.l    hashsize_minus_1,d0    ;d0.l=シンボルのハッシュ関数値
  39.     .endm
  40.   .else
  41. hashfnc    .macro    hashsize
  42.     moveq.l    #0,d0
  43.     moveq.l    #0,d3
  44. @loop:
  45.     move.b    (a2)+,d3
  46.     ori.b    #$20,d3            ;(大文字・小文字の違いは無視)
  47.     sub.w    d3,d0            ;mulu.w #7,d3
  48.     lsl.w    #3,d3            ;add.w d3,d0
  49.     add.w    d3,d0            ;
  50.     dbra    d2,@loop
  51.     divu.w    hashsize,d0        ;ハッシュテーブルサイズ
  52.     clr.w    d0
  53.     swap.w    d0            ;d0.w=シンボルのハッシュ関数値
  54.     .endm
  55.   .endif
  56.  
  57.  
  58. ;----------------------------------------------------------------
  59. ;    予約済みシンボルの初期化
  60. ;----------------------------------------------------------------
  61. defressym::
  62.     move.l    (TEMPPTR,a6),d0
  63.     doquad    d0            ;念のため
  64.     movea.l    d0,a3
  65.     lea.l    (reg_tbl,pc),a2        ;レジスタ名シンボルの初期化
  66.   .ifdef MASK_HASH
  67.     move.l    #SYMHASHSIZE-1,d5    ;ロングにすること
  68.   .else
  69.     move.w    #SYMHASHSIZE,d5
  70.   .endif
  71.     movea.l    (SYMHASHPTR,a6),a5
  72. defressym1:
  73.     movea.l    a2,a0
  74.     moveq.l    #-2,d1
  75. defressym2:
  76.     addq.w    #1,d1
  77.     tst.b    (a2)+
  78.     bne    defressym2
  79.     bsr    getsymchain
  80.     move.l    a3,(a1)
  81.     clr.l    (a3)+            ;$00 SYM_NEXT
  82.     move.l    a0,(a3)+        ;$04 SYM_NAME
  83.     move.w    #ST_REGISTER<<8,(a3)+    ;$08 SYM_TYPE,$09 空き
  84. ;a2が奇数番地のことがあるので.wにしないこと
  85.     move.b    (a2)+,(a3)+        ;$0A SYM_ARCH
  86.     move.b    (a2)+,(a3)+        ;$0B SYM_ARCH2
  87.     move.b    (a2)+,(a3)+        ;$0C SYM_REGNO
  88.     addq.l    #3,a3            ;$10 ロングワード境界に合わせる
  89.     tst.b    (a2)
  90.     bne    defressym1
  91.  
  92.     llea    opcode_tbl,a2        ;命令名シンボルの初期化
  93.     llea    opadr_tbl,a4
  94.   .ifdef MASK_HASH
  95.     move.l    #CMDHASHSIZE-1,d5    ;ロングにすること
  96.   .else
  97.     move.w    #CMDHASHSIZE,d5
  98.   .endif
  99.     movea.l    (CMDHASHPTR,a6),a5
  100. defressym3:
  101.     movea.l    a2,a0
  102.     moveq.l    #-2,d1
  103. defressym4:
  104.     addq.w    #1,d1
  105.     tst.b    (a2)+
  106.     bne    defressym4
  107.     bsr    getsymchain
  108.     move.l    a3,(a1)
  109.     clr.l    (a3)+            ;$00 SYM_NEXT
  110.     move.l    a0,(a3)+        ;$04 SYM_NAME
  111.     move.b    #ST_OPCODE,(a3)+    ;$08 SYM_TYPE
  112.     move.b    (a2)+,(a3)+        ;$09 SYM_NOOPR
  113. ;a2が奇数番地のことがあるので.wや.lにしないこと
  114.     move.b    (a2)+,(a3)+        ;$0A SYM_ARCH
  115.     move.b    (a2)+,(a3)+        ;$0B SYM_ARCH2
  116.     move.b    (a2)+,(a3)+        ;$0C SYM_SIZE
  117.     move.b    (a2)+,(a3)+        ;$0D SYM_SIZE2
  118.     move.w    (a4)+,(a3)+        ;$0E SYM_OPCODE
  119.     move.l    (a4)+,d0
  120.     lea.l    (-4,a4,d0.l),a0
  121.     move.l    a0,(a3)+        ;$10 SYM_FUNC
  122.                     ;$14
  123.     tst.b    (a2)
  124.     bne    defressym3
  125.  
  126.     move.l    a3,(TEMPPTR,a6)
  127.     bsr    memcheck
  128.     rts
  129.  
  130. ;----------------------------------------------------------------
  131. ;    シンボルテーブルチェインの末尾を得る
  132. getsymchain:
  133.     move.l    a2,-(sp)
  134.     move.w    d1,d2            ;文字列長-1
  135.     movea.l    a0,a2            ;文字列へのポインタ
  136.     hashfnc    d5            ;シンボルハッシュ関数値を計算
  137.     lsl.l    #2,d0
  138.     add.l    a5,d0            ;シンボルハッシュテーブルアドレス
  139.     movea.l    d0,a1
  140. getsymchain1:
  141.     tst.l    (a1)            ;(SYM_NEXT(a1))
  142.     beq    getsymchain2
  143.     movea.l    (a1),a1
  144.     bra    getsymchain1
  145.  
  146. getsymchain2:
  147.     movea.l    (sp)+,a2
  148.     rts
  149.  
  150.  
  151. ;----------------------------------------------------------------
  152. ;    シンボルテーブルの検索
  153. ;----------------------------------------------------------------
  154.  
  155. ;----------------------------------------------------------------
  156. ;    名前がシンボルとして登録済かどうか調べる
  157. ;    in :a0=文字列へのポインタ/d1.w=文字列長-1
  158. ;    out:d0.l=登録済なら0 /a1=シンボルテーブルへのポインタ
  159. ;         未登録なら-1/a1=ハッシュテーブル未使用部へのポインタ
  160. ;        d1.w=/8が指定されていたら文字列長を修正
  161. isdefdsym::
  162.     movem.l    d2-d3/a2-a3,-(sp)
  163.     tst.b    (SYMLEN8,a6)
  164.     beq    isdefdsym1
  165.     cmp.w    #8-1,d1
  166.     bls    isdefdsym1
  167.     moveq.l    #8-1,d1            ;/8が指定されていた場合8文字目以降は無視
  168. isdefdsym1:
  169.     move.w    d1,d2            ;文字列長-1
  170.     movea.l    a0,a2            ;文字列へのポインタ
  171.   .ifdef MASK_HASH
  172.     hashfnc    #SYMHASHSIZE-1        ;シンボルハッシュ関数値を計算
  173.   .else
  174.     hashfnc    #SYMHASHSIZE        ;シンボルハッシュ関数値を計算
  175.   .endif
  176.     lsl.l    #2,d0
  177.     add.l    (SYMHASHPTR,a6),d0    ;シンボルハッシュテーブルアドレス
  178.     movea.l    d0,a1
  179. isdefdsym3:
  180.     move.l    (a1),d0            ;(SYM_NEXT(a1))
  181.     beq    isdefdsym9        ;未登録だった
  182.     movea.l    d0,a1
  183.     move.b    (SYM_TYPE,a1),d3    ;シンボルタイプ
  184.     bpl    isdefdsym5        ;ユーザー定義シンボル
  185.     move.w    (SYM_ARCH,a1),d3    ;予約シンボル(命令/レジスタ名)の場合
  186.     beq    isdefdsym35        ;疑似命令の場合
  187.     and.w    (CPUTYPE,a6),d3
  188.     beq    isdefdsym3        ;現在のCPUタイプと合致しないので無視
  189. isdefdsym35:
  190.     move.w    d1,d2            ;文字列長-1
  191.     movea.l    a0,a2            ;文字列へのポインタ
  192.     movea.l    (SYM_NAME,a1),a3
  193. isdefdsym4:
  194.     move.b    (a2)+,d0
  195. ;    tolower    d0            ;予約シンボルは大文字・小文字を区別しない
  196.     ori.w    #$20,d0            ;(0~9,A~Z以外の文字は考慮しなくてよい)
  197.     cmp.b    (a3)+,d0
  198.     dbne    d2,isdefdsym4
  199.     bne    isdefdsym3        ;シンボル名が一致しなかった
  200.     tst.b    (a3)
  201.     bne    isdefdsym3        ;    〃
  202.     moveq.l    #0,d0            ;一致した場合
  203.     movem.l    (sp)+,d2-d3/a2-a3
  204.     rts
  205.  
  206. isdefdsym5:                ;ユーザー定義シンボル
  207.     cmpi.b    #ST_LOCAL,d3
  208.     beq    isdefdsym3        ;ローカルラベルなら無視
  209.     move.w    d1,d2            ;文字列長-1
  210.     movea.l    a0,a2            ;文字列へのポインタ
  211.     movea.l    (SYM_NAME,a1),a3
  212. isdefdsym6:
  213.     cmpm.b    (a2)+,(a3)+
  214.     dbne    d2,isdefdsym6
  215.     bne    isdefdsym3        ;シンボル名が一致しなかった
  216.     tst.b    (a3)
  217.     bne    isdefdsym3        ;    〃
  218.     moveq.l    #0,d0            ;一致した場合
  219.     movem.l    (sp)+,d2-d3/a2-a3
  220.     rts
  221.  
  222. isdefdsym9:                ;未登録だった場合
  223.     moveq.l    #-1,d0
  224.     movem.l    (sp)+,d2-d3/a2-a3
  225.     rts
  226.  
  227. ;----------------------------------------------------------------
  228. ;    名前がマクロとして登録済かどうか調べる
  229. ;    in :a0=マクロ名へのポインタ/d1.w=マクロ名長-1
  230. ;    out:d0.l=登録済なら0 /a1=シンボルテーブルへのポインタ
  231. ;         未登録なら-1/a1=新しいシンボル属性テーブルへのポインタ
  232. ;        d1.w=/8が指定されていたら文字列長を修正
  233. isdefdmac::
  234.     tst.b    (SYMLEN8,a6)
  235.     beq    isdefdmac1
  236.     cmp.w    #8-1,d1
  237.     bls    isdefdmac1
  238.     moveq.l    #8-1,d1            ;/8が指定されていた場合8字目以降は無視
  239. isdefdmac1:
  240.     move.w    d1,d2            ;文字列長-1
  241.     movea.l    a0,a2            ;文字列へのポインタ
  242.   .ifdef MASK_HASH
  243.     hashfnc    #CMDHASHSIZE-1        ;命令ハッシュ関数値を計算
  244.   .else
  245.     hashfnc    #CMDHASHSIZE        ;命令ハッシュ関数値を計算
  246.   .endif
  247.     lsl.l    #2,d0
  248.     add.l    (CMDHASHPTR,a6),d0    ;命令ハッシュテーブルアドレス
  249.     movea.l    d0,a1
  250.     movea.l    d0,a4            ;シンボルテーブルチェインの先頭
  251. isdefdmac3:
  252.     move.l    (a1),d0            ;(SYM_NEXT(a1))
  253.     beq    isdefdmac9        ;未登録だった
  254.     movea.l    d0,a1
  255.     cmpi.b    #ST_MACRO,(SYM_TYPE,a1)    ;シンボルタイプ
  256.     bne    isdefdmac3        ;マクロ名でない    (isdefdmac9)
  257.     move.w    d1,d2            ;文字列長-1
  258.     movea.l    a0,a2            ;文字列へのポインタ
  259.     movea.l    (SYM_NAME,a1),a3
  260. isdefdmac4:
  261.     move.b    (a2)+,d0
  262.     bmi    isdefdmac10        ;半角カタカナ/2バイト文字
  263.     tolower    d0            ;マクロ名は大文字・小文字を区別しない
  264. isdefdmac5:
  265.     cmp.b    (a3)+,d0
  266.     dbne    d2,isdefdmac4
  267.     bne    isdefdmac3        ;シンボル名が一致しなかった
  268. isdefdmac6:
  269.     tst.b    (a3)
  270.     bne    isdefdmac3        ;    〃
  271.     moveq.l    #0,d0            ;一致した場合
  272.     rts
  273.  
  274. isdefdmac9:                ;未登録だった場合
  275.     movea.l    a4,a1            ;シンボルテーブルはポインタチェインの先頭に作成する
  276.     moveq.l    #-1,d0
  277.     rts
  278.  
  279. isdefdmac10:
  280.   .if EUCSRC=0
  281.     cmp.b    #$E0,d0
  282.     bcc    isdefdmac11
  283.     cmp.b    #$A0,d0
  284.     bcc    isdefdmac5        ;半角カタカナ
  285.   .else
  286.     bra    isdefdmac5        ;EUC
  287.   .endif
  288. isdefdmac11:                ;2バイト文字
  289.     cmp.b    (a3)+,d0
  290.     bne    isdefdmac3
  291.     subq.w    #1,d2
  292.     bcs    isdefdmac6
  293.     move.b    (a2)+,d0        ;2バイト文字の2バイト目
  294.     bra    isdefdmac5
  295.  
  296. ;----------------------------------------------------------------
  297. ;    ローカルラベルが登録済かどうか調べる
  298. ;    in :d1.l=ローカルラベル番号
  299. ;    out:d0.l=登録済なら0 /a1=シンボルテーブルへのポインタ
  300. ;         未登録なら-1/a1=ハッシュテーブル未使用部へのポインタ
  301. isdefdlocsym::
  302.   .ifdef MASK_HASH
  303.     move.l    d1,d0
  304.     swap.w    d0
  305.     lsl.w    #5,d0
  306.     eor.w    d1,d0
  307.     and.l    #SYMHASHSIZE-1,d0    ;ロングにすること
  308.   .else
  309.     moveq.l    #0,d0
  310.     move.w    d1,d0
  311.     divu.w    #SYMHASHSIZE,d0
  312.     clr.w    d0
  313.     swap.w    d0            ;d0.w=シンボルのハッシュ関数値
  314.   .endif
  315.     lsl.l    #2,d0
  316.     add.l    (SYMHASHPTR,a6),d0    ;シンボルのハッシュテーブルアドレス
  317.     movea.l    d0,a1
  318. isdefdlocsym1:
  319.     move.l    (a1),d0            ;(SYM_NEXT(a1))
  320.     beq    isdefdlocsym9        ;未登録だった
  321.     movea.l    d0,a1
  322.     cmpi.b    #ST_LOCAL,(SYM_TYPE,a1)    ;シンボルタイプ
  323.     bne    isdefdlocsym1        ;ローカルラベルでない
  324.     cmp.l    (SYM_NAME,a1),d1
  325.     bne    isdefdlocsym1        ;番号が違う
  326.     moveq.l    #0,d0            ;一致した場合
  327.     rts
  328.  
  329. isdefdlocsym9:                ;未登録だった場合
  330.     moveq.l    #-1,d0
  331.     rts
  332.  
  333.  
  334. ;----------------------------------------------------------------
  335. ;    命令・マクロ名の検索
  336. ;----------------------------------------------------------------
  337.  
  338. ;----------------------------------------------------------------
  339. ;    文字列が命令,マクロがどうかを調べる(マクロ優先)
  340. ;    in :a0=文字列へのポインタ/d1.w=文字列長-1
  341. ;    out:d0.w=命令,マクロなら0
  342. getmaccmd::
  343.     movem.l    d2-d4/a1-a3,-(sp)
  344.     moveq.l    #0,d0
  345.     move.b    (a0),d2
  346.     beq    getmaccmd99
  347.     cmp.b    #'*',d2
  348.     beq    getmaccmd99
  349.     cmp.b    #';',d2            ;拡張モードのコメント
  350.     beq    getmaccmd99
  351. getmaccmd0:
  352.     cmp.b    #'=',d2
  353.     bne    getmaccmd1
  354.     lea.l    (getmacset,pc),a0    ;'=' → 'set'
  355.     moveq.l    #3-1,d1
  356. getmaccmd1:
  357.     move.w    d1,d4
  358.     tst.b    (SYMLEN8,a6)
  359.     beq    getmaccmd2
  360.     cmp.w    #8-1,d4
  361.     bls    getmaccmd2
  362.     moveq.l    #8-1,d4            ;/8が指定されていた場合マクロは8字目以降を無視
  363. getmaccmd2:
  364.     move.w    d4,d2            ;文字列長-1(8文字目まで)
  365.     movea.l    a0,a2            ;文字列へのポインタ
  366.   .ifdef MASK_HASH
  367.     hashfnc    #CMDHASHSIZE-1        ;命令ハッシュ関数値を計算
  368.   .else
  369.     hashfnc    #CMDHASHSIZE        ;命令ハッシュ関数値を計算
  370.   .endif
  371.     lsl.l    #2,d0
  372.     add.l    (CMDHASHPTR,a6),d0    ;命令ハッシュテーブルアドレス
  373.     movea.l    d0,a1
  374. getmaccmd5:
  375.     move.l    (a1),d0            ;(SYM_NEXT(a1))
  376.     beq    getmaccmd80        ;シンボルが見つからない
  377.     movea.l    d0,a1
  378.     tst.b    (SYM_TYPE,a1)        ;シンボルタイプ
  379.     bmi    getmaccmd21        ;予約シンボル(命令)
  380.     move.w    d4,d2            ;(/8が指定されていたら8文字目までしか比較しない)
  381.     movea.l    a0,a2            ;文字列へのポインタ
  382.     movea.l    (SYM_NAME,a1),a3
  383. getmaccmd6:
  384.     move.b    (a2)+,d0
  385.     bmi    getmaccmd10        ;半角カタカナ/2バイト文字
  386.     tolower    d0            ;マクロ名は大文字・小文字を区別しない
  387. getmaccmd7:
  388.     cmp.b    (a3)+,d0
  389.     dbne    d2,getmaccmd6
  390.     bne    getmaccmd5        ;シンボル名が一致しなかった
  391. getmaccmd8:
  392.     tst.b    (a3)
  393.     bne    getmaccmd5        ;    〃
  394. getmaccmd70:                ;マクロ名を見つけた
  395.     move.l    a1,(CMDTBLPTR,a6)    ;シンボルテーブルへのポインタ
  396.     st.b    (ISMACRO,a6)
  397.     moveq.l    #0,d0
  398.     movem.l    (sp)+,d2-d4/a1-a3
  399.     rts
  400.  
  401. getmaccmd10:
  402.   .if EUCSRC=0
  403.     cmp.b    #$E0,d0
  404.     bcc    getmaccmd11
  405.     cmp.b    #$A0,d0
  406.     bcc    getmaccmd7        ;半角カタカナ
  407.   .else
  408.     bra    getmaccmd7        ;EUC
  409.   .endif
  410. getmaccmd11:                ;2バイト文字
  411.     cmp.b    (a3)+,d0
  412.     bne    getmaccmd5
  413.     subq.w    #1,d2
  414.     bcs    getmaccmd8
  415.     move.b    (a2)+,d0        ;2バイト文字の2バイト目
  416.     bra    getmaccmd7
  417.  
  418. getmaccmd20:                ;テーブルチェインから命令を検索する
  419.     move.l    (a1),d0            ;(SYM_NEXT(a1))
  420.     beq    getmaccmd80        ;シンボルが見つからない
  421.     movea.l    d0,a1
  422. getmaccmd21:
  423.     move.w    (SYM_ARCH,a1),d3    ;予約シンボル(命令/レジスタ名)の場合
  424.     beq    getmaccmd215        ;疑似命令の場合
  425.     and.w    (CPUTYPE,a6),d3
  426.     beq    getmaccmd20        ;現在のCPUタイプと合致しないので無視
  427. getmaccmd215:
  428.     move.w    d1,d2            ;(/8の指定に関わらず全文字比較する)
  429.     movea.l    a0,a2            ;文字列へのポインタ
  430.     movea.l    (SYM_NAME,a1),a3
  431. getmaccmd22:
  432.     move.b    (a2)+,d0
  433. ;    tolower    d0            ;予約シンボルは大文字・小文字を区別しない
  434.     ori.w    #$20,d0            ;(0~9,A~Z以外の文字は考慮しなくてよい)
  435.     cmp.b    (a3)+,d0
  436.     dbne    d2,getmaccmd22
  437.     bne    getmaccmd20        ;シンボル名が違う
  438.     tst.b    (a3)
  439.     bne    getmaccmd20        ;    〃
  440. getmaccmd90:
  441.     move.l    a1,(CMDTBLPTR,a6)    ;シンボルテーブルへのポインタ
  442.     sf.b    (ISMACRO,a6)
  443.     moveq.l    #0,d0
  444.     movem.l    (sp)+,d2-d4/a1-a3
  445.     rts
  446.  
  447. getmaccmd99:                ;命令・マクロが指定されていない
  448.     clr.l    (CMDTBLPTR,a6)
  449.     moveq.l    #0,d0
  450.     movem.l    (sp)+,d2-d4/a1-a3
  451.     rts
  452.  
  453. getmaccmd80:                ;該当する命令・マクロがない
  454.     clr.l    (CMDTBLPTR,a6)
  455.     moveq.l    #-1,d0
  456.     movem.l    (sp)+,d2-d4/a1-a3
  457.     rts
  458.  
  459. getmacset:    .dc.b    'set'
  460.         .even
  461.  
  462. ;----------------------------------------------------------------
  463. ;    文字列が命令,マクロがどうかを調べる(命令優先)
  464. ;    in :a0=文字列へのポインタ/d1.w=文字列長-1
  465. ;    out:d0.w=命令,マクロなら0
  466. getcmdmac::
  467.     movem.l    d2-d4/a1-a3,-(sp)
  468.     moveq.l    #0,d0
  469.     move.b    (a0),d2
  470.     beq    getmaccmd99
  471.     cmp.b    #'*',d2
  472.     beq    getmaccmd99
  473.     cmp.b    #';',d2            ;拡張モードのコメント
  474.     beq    getmaccmd99
  475. getcmdmac0:
  476.     cmp.b    #'=',d2
  477.     bne    getcmdmac1
  478.     lea.l    (getmacset,pc),a0    ;'=' → 'set'
  479.     moveq.l    #3-1,d1
  480. getcmdmac1:
  481.     move.w    d1,d4
  482.     tst.b    (SYMLEN8,a6)
  483.     beq    getcmdmac2
  484.     cmp.w    #8-1,d4
  485.     bls    getcmdmac2
  486.     moveq.l    #8-1,d4            ;/8が指定されていた場合マクロは8字目以降を無視
  487. getcmdmac2:
  488.     move.w    d4,d2            ;文字列長-1(8文字目まで)
  489.     movea.l    a0,a2            ;文字列へのポインタ
  490.   .ifdef MASK_HASH
  491.     hashfnc    #CMDHASHSIZE-1        ;命令ハッシュ関数値を計算
  492.   .else
  493.     hashfnc    #CMDHASHSIZE        ;命令ハッシュ関数値を計算
  494.   .endif
  495.     lsl.l    #2,d0
  496.     add.l    (CMDHASHPTR,a6),d0    ;命令ハッシュテーブルアドレス
  497.     movea.l    d0,a1
  498.     movea.l    d0,a5
  499. getcmdmac5:                ;テーブルチェインから命令を検索する
  500.     move.l    (a1),d0            ;(SYM_NEXT(a1))
  501.     beq    getmaccmd80        ;シンボルが見つからない
  502.     movea.l    d0,a1
  503.     tst.b    (SYM_TYPE,a1)        ;シンボルタイプ
  504.     bpl    getcmdmac5        ;マクロ名は無視する
  505.     bra    getcmdmac7
  506.  
  507. getcmdmac6:
  508.     move.l    (a1),d0            ;(SYM_NEXT(a1))
  509.     beq    getcmdmac9        ;シンボルが見つからない→マクロとして再検索
  510.     movea.l    d0,a1
  511. getcmdmac7:
  512.     move.w    (SYM_ARCH,a1),d3    ;予約シンボル(命令/レジスタ名)の場合
  513.     beq    getcmdmac75        ;疑似命令の場合
  514.     and.w    (CPUTYPE,a6),d3
  515.     beq    getcmdmac6        ;現在のCPUタイプと合致しないので無視
  516. getcmdmac75:
  517.     move.w    d1,d2            ;(/8の指定に関わらず全文字比較する)
  518.     movea.l    a0,a2            ;文字列へのポインタ
  519.     movea.l    (SYM_NAME,a1),a3
  520. getcmdmac8:
  521.     move.b    (a2)+,d0
  522. ;    tolower    d0            ;予約シンボルは大文字・小文字を区別しない
  523.     ori.w    #$20,d0            ;(0~9,A~Z以外の文字は考慮しなくてよい)
  524.     cmp.b    (a3)+,d0
  525.     dbne    d2,getcmdmac8
  526.     bne    getcmdmac6        ;シンボル名が違う
  527.     tst.b    (a3)
  528.     bne    getcmdmac6        ;    〃
  529.     bra    getmaccmd90        ;命令を見つけた
  530.  
  531. getcmdmac9:                ;マクロとして再検索する
  532.     movea.l    a5,a1
  533.     bra    getmaccmd5
  534.  
  535.  
  536. ;----------------------------------------------------------------
  537. ;    シンボルテーブルの作成
  538. ;----------------------------------------------------------------
  539.  
  540. ;----------------------------------------------------------------
  541. ;    文字列の名前のシンボルテーブルを作成する
  542. ;    in :a0=文字列へのポインタ/d1.w=文字列長-1
  543. ;        a1=ハッシュテーブル未使用部へのポインタ
  544. ;        d2.b=シンボルテーブルタイプ
  545. ;    out:a1=シンボルテーブルへのポインタ
  546. defsymbol::
  547.     movem.l    a2-a3,-(sp)
  548.     movea.l    (TEMPPTR,a6),a2
  549.     movea.l    a2,a3            ;シンボル名へのポインタ
  550. defsymbol1:
  551.     move.b    (a0)+,(a3)+        ;シンボル名をワークにコピー
  552.     dbra    d1,defsymbol1
  553.     clr.b    (a3)+
  554.     move.l    a3,(TEMPPTR,a6)
  555.     bsr    getsymtbl
  556.     move.l    a0,(a1)            ;ハッシュチェインをつなぐ
  557.     movea.l    a0,a1
  558.     move.b    d2,(SYM_TYPE,a1)
  559.     move.l    a2,(SYM_NAME,a1)
  560.     movem.l    (sp)+,a2-a3
  561.     bra    memcheck
  562.  
  563. ;----------------------------------------------------------------
  564. ;    シンボルテーブルのアドレスを得る
  565. getsymtbl:
  566.     subq.w    #1,(SYMTBLCOUNT,a6)
  567.     bmi    getsymtbl1        ;現在のシンボルテーブルブロックを使い尽くした
  568.     movea.l    (SYMTBLPTR,a6),a0
  569.     lea.l    (SYM_TBLLEN,a0),a0    ;テーブルブロックの次のアドレスを得る
  570.     move.l    a0,(SYMTBLPTR,a6)
  571.     rts
  572.  
  573. getsymtbl1:                ;シンボルテーブルブロックを拡張する
  574.     move.l    (TEMPPTR,a6),d0
  575.     doquad    d0
  576.     movea.l    (SYMTBLCURBGN,a6),a0
  577.     move.l    d0,(a0)            ;シンボルテーブルブロックのチェインをつなぐ
  578.     move.l    d0,(SYMTBLCURBGN,a6)
  579.     movea.l    d0,a0
  580.     add.l    #SYM_TBLLEN*SYMEXTCOUNT+4,d0
  581.     move.l    d0,(TEMPPTR,a6)
  582.     bsr    memcheck
  583.     move.l    d1,-(sp)
  584.     moveq.l    #0,d1
  585.     move.w    #SYM_TBLLEN*SYMEXTCOUNT/16,d0
  586. getsymtbl2:
  587.   .rept 16/4
  588.     move.l    d1,(a0)+        ;拡張したブロックをクリアする
  589.   .endm
  590.     dbra    d0,getsymtbl2
  591.     move.l    (sp)+,d1
  592.     move.w    #SYMEXTCOUNT-1,(SYMTBLCOUNT,a6)
  593.     movea.l    (SYMTBLCURBGN,a6),a0
  594.     addq.l    #4,a0
  595.     move.l    a0,(SYMTBLPTR,a6)
  596.     rts
  597.  
  598. ;----------------------------------------------------------------
  599. ;    文字列の名前のマクロ名シンボルテーブルを作成する
  600. ;    in :a0=文字列へのポインタ/d1.w=文字列長-1
  601. ;        a1=ハッシュテーブル未使用部へのポインタ(ポインタチェインの先頭)
  602. ;    out:a1=シンボルテーブルへのポインタ
  603. defmacsymbol::
  604.     movem.l    a2-a3,-(sp)
  605.     movea.l    (TEMPPTR,a6),a2
  606.     movea.l    a2,a3            ;シンボル名へのポインタ
  607. defmacsymbol1:
  608.     move.b    (a0)+,d0
  609.     bmi    defmacsymbol5
  610.     tolower    d0
  611. defmacsymbol2:
  612.     move.b    d0,(a3)+
  613.     dbra    d1,defmacsymbol1
  614. defmacsymbol3:
  615.     clr.b    (a3)+
  616.     move.l    a3,(TEMPPTR,a6)
  617.     bsr    getsymtbl
  618.     move.l    (a1),d0
  619.     move.l    a0,(a1)            ;ポインタチェインの先頭になる
  620.     move.l    a0,a1
  621.     move.l    d0,(a1)            ;(SYM_NEXT(a1))
  622.     move.b    #ST_MACRO,(SYM_TYPE,a1)
  623.     move.l    a2,(SYM_NAME,a1)
  624.     movem.l    (sp)+,a2-a3
  625.     bra    memcheck
  626.  
  627. defmacsymbol5:
  628.   .if EUCSRC=0
  629.     cmp.b    #$E0,d0
  630.     bcc    defmacsymbol6
  631.     cmp.b    #$A0,d0
  632.     bcc    defmacsymbol2        ;半角カタカナ
  633.   .else
  634.     bra    defmacsymbol2        ;EUC
  635.   .endif
  636. defmacsymbol6:                ;2バイト文字
  637.     move.b    d0,(a3)+
  638.     subq.w    #1,d1
  639.     bmi    defmacsymbol3
  640.     move.b    (a0)+,d0
  641.     bra    defmacsymbol2
  642.  
  643. ;----------------------------------------------------------------
  644. ;    ローカルラベルのシンボルテーブルを作成する
  645. ;    in :d1.l=ローカルラベル番号
  646. ;       :a1=ハッシュテーブル未使用部へのポインタ
  647. ;    out:a1=シンボルテーブルへのポインタ
  648. deflocsymbol::
  649.     bsr    getsymtbl
  650.     move.l    a0,(a1)
  651.     movea.l    a0,a1
  652.     move.b    #ST_LOCAL,(SYM_TYPE,a1)
  653.     move.l    d1,(SYM_LOCALNO,a1)    ;ローカルシンボル番号
  654.     rts
  655.  
  656. ;----------------------------------------------------------------
  657. ;    与えられた文字列をシンボルとして登録する
  658. ;    in :a0=文字列へのポインタ(asciz)
  659. ;        d2.b=シンボルテーブルタイプ
  660. ;    out:a1=シンボルテーブルへのポインタ
  661. defstrsymbol::
  662.     movea.l    a0,a2
  663.     moveq.l    #-2,d1            ;文字列の長さを求める
  664. defstrsymbol1:
  665.     addq.w    #1,d1
  666.     tst.b    (a2)+
  667.     bne    defstrsymbol1
  668.     movea.l    a0,a2
  669.     bsr    isdefdsym
  670.     tst.w    d0
  671.     beq    defstrsymbol9        ;すでに登録済だった
  672.     clr.b    (1,a2,d1.w)        ;(/8が指定された場合のため)
  673.     bsr    getsymtbl
  674.     move.l    a0,(a1)
  675.     movea.l    a0,a1
  676.     move.b    d2,(SYM_TYPE,a1)
  677.     move.l    a2,(SYM_NAME,a1)
  678. defstrsymbol9:
  679.     rts
  680.  
  681.  
  682. ;----------------------------------------------------------------
  683.     .end
  684.  
  685. ;----------------------------------------------------------------
  686. ;    $Log: symbol.s,v $
  687. ;    Revision 1.8  1999 10/ 8(Fri) 21:49:32 M.Kamada
  688. ;    +86 EUC対応準備
  689. ;
  690. ;    Revision 1.7  1999  3/16(Tue) 03:40:18 M.Kamada
  691. ;    +83 数字ローカルラベルを4桁まで対応
  692. ;
  693. ;    Revision 1.6  1999  3/ 3(Wed) 17:36:25 M.Kamada
  694. ;    +82 レジスタ名シンボルが奇数番地から始まっていたので修正
  695. ;    +82 ハッシュテーブルのサイズを2のべき乗にしてdivuを除去
  696. ;    +82 doeven→doquad
  697. ;
  698. ;    Revision 1.5  1999  2/27(Sat) 23:45:36 M.Kamada
  699. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  700. ;
  701. ;    Revision 1.4  1999  2/20(Sat) 17:37:32 M.Kamada
  702. ;    +80 ColdFire対応
  703. ;
  704. ;    Revision 1.3  1994/07/10  12:46:16  nakamura
  705. ;    オペランドなし命令への対応の変更
  706. ;
  707. ;    Revision 1.2  1994/04/05  13:07:20  nakamura
  708. ;    マクロ名に2バイト文字を使用したマクロの展開ができないバグを修正した。
  709. ;
  710. ;    Revision 1.1  1994/02/13  14:18:06  nakamura
  711. ;    Initial revision
  712. ;
  713. ;
  714.